package com.joezj.util;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;

import javax.validation.constraints.NotNull;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;

/**
 * Word导出工具类（将查询数据填充到模板导出）
 *
 * @author: Zheng Jie
 * @version: $ WordExportUtil, V1.0 2020年12月12日 0:32 Zheng Jie Exp $
 */
public class WordExportUtil {

    /** 模板所在包 */
    private static String TEMPLATE_PACKAGE = "wordTemplate/";

    /**
     * <p>
     *     导出模板到输出流中
     * <ul>
     * <li> templateName —— 模板文件名称
     * <ul>
     * <li> 模板文件名称：   book.docx
     * <li> 入参：          "book.docx"
     * </ul>
     * <li> dataMap —— 待填充数据
     * dataMap一般与实体对应，其中key对应模板中占位符字符，如：
     * <ul>
     * <li> 实体类属性：String name = "张三";
     * <li> 模板占位符：姓名：{{name}}
     * </ul>
     * <li> outStream —— 输出流，如：response.getOutputStream()
     * </ul>
     *</p>
     * @param templateName 项目webapp/wordTemplate目录下模板文件名称
     * @param dataMap 需要填充进模板的数据
     * @param outStream 需要被写入的流
     * @throws IOException
     */
    public static void exportWordToStream(@NotNull String templateName,
                                  @NotNull Map dataMap,
                                  @NotNull OutputStream outStream) throws IOException {
        XWPFTemplate xwpfTemplate = null;
        try{
            // 配置
            Configure config = Configure.newBuilder().build();
            // 1. 在tomcat环境下模板存放于webapp时，读取webapp目录路径作为起点
            // String path = IOUtil.webappDirPath();
            // 2. 模板存放于Rsource路径下
            String path = IOUtil.classesDirPath();
            path = path + TEMPLATE_PACKAGE  + templateName;
            InputStream stream = new FileInputStream(new File(path));
            // 编译模板，填充数据
            xwpfTemplate = XWPFTemplate
                    .compile(stream, config)
                    .render(dataMap);
            xwpfTemplate.write(outStream);
        }catch (IOException e){
            throw new RuntimeException("生成文件失败！");
        }finally {
            if(xwpfTemplate != null){
                xwpfTemplate.close();
            }
        }

    }

    /**
     * <p>
     *     导出模板到输出指定路径
     * <ul>
     * <li> templateName —— 模板文件名称
     * <ul>
     * <li> 模板文件名称：   book.docx
     * <li> 入参：          "book.docx"
     * </ul>
     * <li> dataMap —— 待填充数据
     * dataMap一般与实体对应，其中key对应模板中占位符字符，如：
     * <ul>
     * <li> 实体类属性：String name = "张三";
     * <li> 模板占位符：姓名：{{name}}
     * </ul>
     * <li> destDirPath —— 目标存放目录，如：C:\Users\Joe\Desktop\
     * </ul>
     *</p>
     * @param templateName 项目webapp/wordTemplate目录下模板文件名称
     * @param dataMap 需要填充进模板的数据
     * @param destDirPath 目标存放目录
     * @throws IOException
     */
    public static void exportWordToPath(@NotNull String templateName,
                                  @NotNull Map dataMap,
                                  @NotNull String destDirPath) throws IOException {
        XWPFTemplate xwpfTemplate = null;
        try{
            // 配置
            Configure config = Configure.newBuilder().build();
            // 1. 在tomcat环境下模板存放于webapp时，读取webapp目录路径作为起点
            // String path = IOUtil.webappDirPath();
            // 2. 模板存放于Rsource路径下
            String path = IOUtil.classesDirPath();
            path = path + TEMPLATE_PACKAGE  + templateName;
            InputStream stream = new FileInputStream(new File(path));
            // 编译模板，填充数据
            xwpfTemplate = XWPFTemplate
                    .compile(stream, config)
                    .render(dataMap);
            xwpfTemplate.writeToFile(destDirPath);
        }catch (IOException e){
            throw new RuntimeException("生成文件失败！");
        }finally {
            if(xwpfTemplate != null){
                xwpfTemplate.close();
            }
        }

    }
}
